package libreria;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.Serializable;
import java.util.Date;

public class paquete implements Externalizable {

	// private static final long serialVersionUID = 1L;

	public paquete() {
	}

	public paquete(boolean servidor, int tipo, String nombre, double valor,
			int calidad, long tiempo, historico historial, String xmlEstructura) {
		this.servidor = servidor;
		this.tipo = tipo;
		this.nombre = nombre;
		this.valor = valor;
		this.calidad = calidad;
		this.tiempo = tiempo;
		this.historial = historial;
		this.xmlEstructura = xmlEstructura;
	}

	public boolean servidor;
	public int tipo;
	public String nombre;
	public double valor;
	public int calidad;
	public long tiempo;
	public historico historial;
	public String xmlEstructura;

	public String getXmlEstructura() {
		return xmlEstructura;
	}

	public void setXmlEstructura(String xmlEstructura) {
		this.xmlEstructura = xmlEstructura;
	}

	public historico getHistorial() {
		return historial;
	}

	public void setHistorial(historico historial) {
		this.historial = historial;
	}

	@Override
	public void readExternal(ObjectInput in) throws IOException,
			ClassNotFoundException {
		this.servidor = in.readBoolean();
		this.tipo = in.readInt();
		switch (this.tipo) {
		//peticion de estructura
		case 1:
			this.nombre = in.readUTF();
			if (servidor)
				this.xmlEstructura = in.readUTF();
			break;
		// envio de variable desde el servidor
		case 2:
			this.nombre = in.readUTF();
			this.valor = in.readDouble();
			this.calidad = in.readInt();
			this.tiempo=in.readLong();
			break;
		case 5:
			this.nombre = in.readUTF();
			this.valor = in.readDouble();
			this.calidad = in.readInt();
			this.tiempo=in.readLong();
			break;
		//envio de historico	
		case 3 :
			this.nombre = in.readUTF();
			int mi  = in.readInt();
			this.historial= new historico (mi);
			this.historial.marca=in.readInt();
			int nonulos=in.readInt();
			 for (int i = 0; i <= nonulos; i++) {
				 double d=in.readDouble();
				 Date t = new Date ();
				 t.setTime(in.readLong());
				 ItemHistorico his = new ItemHistorico (d,t);
				 historial.buffer[i]=his;			 
			 }
			 break;
		//peticion de conexion	 	
		case 11:
			this.xmlEstructura = in.readUTF();
			break;

		default:
			break;
		}

	}

	@Override
	public void writeExternal(ObjectOutput out) throws IOException {
		// TODO Auto-generated method stub
		out.writeBoolean(this.servidor);
		out.writeInt(this.tipo);
		switch (this.tipo) {
		case 1:
			out.writeUTF(this.nombre);
			if (servidor)
				out.writeUTF(this.xmlEstructura);
			break;
		case 2:
			out.writeUTF(this.nombre);
			out.writeDouble(this.valor);
			out.writeInt(this.calidad);
			out.writeLong(this.tiempo);
			break;
		case 3:
			out.writeUTF(this.nombre);
			out.writeInt(this.historial.buffer.length);
			out.writeInt(this.historial.marca);
			int nonulos =0;
			while (historial.buffer[nonulos]!=null && nonulos<this.historial.buffer.length){
				nonulos =nonulos+1;				
			}
			nonulos=nonulos-1;
			out.writeInt(nonulos);
			
			int cont =0;
			while (cont<=nonulos){
				out.writeDouble(historial.buffer[cont].valor);
				out.writeLong( historial.buffer[cont].tiempo.getTime());
				cont =cont+1;				
			}
/*			for (int i = 0; i < this.historial.buffer.length; i++) {
				out.writeDouble(historial.buffer[i].valor.doubleValue());
				out.writeLong( historial.buffer[i].tiempo.getTime());				 
			 }
			 */
			break;
		case 5:
			out.writeUTF(this.nombre);
			out.writeDouble(this.valor);
			out.writeInt(this.calidad);
			out.writeLong(this.tiempo);
			break;
		case 11:
			out.writeUTF(this.xmlEstructura);
			break;

		default:
			break;
		}

	}

}
